package br.edu.utfpr.backuptools.BackupTools.controller;

import java.io.File;
import java.util.Calendar;
import java.util.List;

import br.edu.utfpr.backuptools.BackupTools.controller.interfaces.ControladorBackup;
import br.edu.utfpr.backuptools.BackupTools.controller.validator.RetornoValidacao;
import br.edu.utfpr.backuptools.BackupTools.controller.validator.Validator;
import br.edu.utfpr.backuptools.BackupTools.model.dao.interfaces.DaoBackup;
import br.edu.utfpr.backuptools.BackupTools.model.pojo.Backup;
import br.edu.utfpr.backuptools.BackupTools.util.backup.ZipUtil;
import br.edu.utfpr.backuptools.BackupTools.view.telas.principal.JanelaPrincipal;

public class ControladorBackupImpl extends ControladorBackup{
	
	ZipUtil zip;
	
	public ControladorBackupImpl(DaoBackup dao, Validator<Backup> validator){
		this.dao = dao;
		this.validator = validator;
	}

	@Override
	public void gerarTodosBackups(){
		List<Backup> backups = dao.list();
		zip = new ZipUtil();
		JanelaPrincipal.addLog("Rotina de backups inciada");
		
		for (Backup backup : backups) {
			try {
				String fileName =  backup.getOrigem().substring(backup.getOrigem().lastIndexOf("/"), backup.getOrigem().length()) + ZipUtil.PREFIXO + ZipUtil.EXT;
				
				zip.compress(new File(backup.getOrigem()), new File(backup.getDestino() + fileName));
				JanelaPrincipal.addLog("Backup '"+backup.getDescricao()+"' gerado com sucesso em : "+backup.getDestino() + fileName);
				//atualizaData(backup);
			} catch (Exception e) {
				e.printStackTrace();
				JanelaPrincipal.addLog("ERRO GRAVE - Não foi possivel executar a rotina de backups");
				JanelaPrincipal.addLog("Ocorreu um erro a gerar o backup: "+backup.getDescricao());
			}	
		}
		
	}

	@Override
	public RetornoValidacao gerarBackup(Backup backup) {
		zip = new ZipUtil();
		JanelaPrincipal.addLog("Processo de backup inciado");
			try {
				String fileName =  backup.getOrigem().substring(backup.getOrigem().lastIndexOf("/"), backup.getOrigem().length()) + ZipUtil.PREFIXO + ZipUtil.EXT;
				
				zip.compress(new File(backup.getOrigem()), new File(backup.getDestino() + fileName));
				JanelaPrincipal.addLog("Backup '"+backup.getDescricao()+"' gerado com sucesso em : "+backup.getDestino() + fileName);
				//atualizaData(backup);
				return new RetornoValidacao();
			} catch (Exception e) {
				e.printStackTrace();
				JanelaPrincipal.addLog("Ocorreu um erro ao gerar o backup: "+backup.getDescricao());
				return new RetornoValidacao("Ocorreu um erro a gerar o backup: "+backup.getDescricao());
			}
	}
	
	public void atualizaData(Backup backup){
		backup.setDataUltimoBackup(Calendar.getInstance().getTime());
		save(backup);
	}

	@Override
	public RetornoValidacao gerarRestore(Backup backup) {
		zip = new ZipUtil();
		JanelaPrincipal.addLog("Restore do backup "+backup.getDescricao()+" iniciado");
		try {
			String fileName =  backup.getOrigem().substring(backup.getOrigem().lastIndexOf("/"), backup.getOrigem().length()) + ZipUtil.PREFIXO + ZipUtil.EXT;
			
			zip.extrairZip(new File(backup.getDestino() + fileName), new File((String) backup.getOrigem().subSequence(0, backup.getOrigem().lastIndexOf("/"))));
			
			JanelaPrincipal.addLog("Restore efetuado com sucesso");
			return new RetornoValidacao();
		} catch (Exception e) {
			e.printStackTrace();
			JanelaPrincipal.addLog("Ocorreu um erro ao gerar o restore");
			return new RetornoValidacao("Ocorreu um erro a gerar o restore");
		}
	}
}
